package array;

import java.util.Arrays;

/**
 * @author: june
 * @date: 2023/8/15
 * @description: 238. 除自身以外数组的乘积
 * 给你一个整数数组 nums，返回 数组 answer ，其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。
 * <p>
 * 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内。
 * <p>
 * 请不要使用除法，且在 O(n) 时间复杂度内完成此题。
 **/

public class ProductExceptSelf_238 {
    public int[] productExceptSelf(int[] nums) {
        // left[i]表示nums[i]左边元素的乘积，不包括nums[i]，right[i]同理
        int[] left = new int[nums.length];
        int[] right = new int[nums.length];

        int[] result = new int[nums.length];

        left[0] = 1;
        right[right.length - 1] = 1;

        for (int i = 1; i < nums.length; i++) {
            left[i] = left[i - 1] * nums[i - 1];
        }

        for (int i = nums.length - 2; i >= 0; i--) {
            right[i] = right[i + 1] * nums[i + 1];
        }

        for (int i = 0; i < result.length; i++) {
            result[i] = left[i] * right[i];
        }

        return result;
    }

    public static void main(String[] args) {
        int[] nums = {-1,1,0,-3,3};
        ProductExceptSelf_238 productExceptSelf238 = new ProductExceptSelf_238();
        int[] ints = productExceptSelf238.productExceptSelf(nums);
        System.out.println(Arrays.toString(ints));
    }
}
